package com.probiz.estore.product.dao;

import java.math.BigDecimal;
import java.util.List;


import com.probiz.estore.core.dao.GenericDao;
import com.probiz.estore.core.search.SearchCriteria;
import com.probiz.estore.common.model.product.Product;
import com.probiz.estore.product.model.ProductSearchCriteria;
import com.probiz.estore.common.model.catalog.ProductCategory;

/**
 * Dao interface for Product.
 */
public interface ProductDao extends GenericDao<Product> {
	/**
	 * 根据目录id获得直接所属产品个数
	 * @param categoryId 目录id
	 * @return 直接所属产品个数
	 */
	public Integer countProductByCategoryId(Integer categoryId);
	/**
	 * 搜索产品
	 * @param productSearchCriteria 自定义搜索条件
	 * @param searchCriteria 分页搜索条件
	 * @return 搜索结果
	 */
	public List<Product> searchByCriteria(ProductSearchCriteria productSearchCriteria,SearchCriteria searchCriteria);
	/**
	 * 根据目录获得所属产品个数,包括子孙目录的产品
	 * @param productCategory 产品目录
	 * @return Integer 产品总数
	 */
	public Integer countProductIncludeAllByCategory(ProductCategory productCategory);
	/**
	 * 根据目录获得激活所属产品个数,包括子孙目录的产品
	 * @param productCategory 产品目录
	 * @return 产品总数
	 */
	public Integer countActiveProductIncludeAllByCategory(ProductCategory productCategory);

	/**
	 * 根据商铺id获得上架产品数Long[0],总产品数Long[1]
	 * @param storeId 商铺id
	 * @return 上架产品数Long[0],总产品数Long[1]
	 */
	public Long[] getNumOfProductsByStoreId(Integer storeId);
	/**
	 * 获得指定目录下产品的最大价格
	 * @param fullCategoryPath 目录全路径
     * @return 最大价格
	 */
	public BigDecimal getMaxPriceByCategoryId(String fullCategoryPath);
	/**
	 * 根据产品目录和显示标志获得产品列表
	 * @param productCategory 产品目录
	 * @param displayFlag 显示标志 new Product.DISPLAYFLAG_NEW;  hot Product.DISPLAYFLAG_HOT
	 * @param size 最多显示个数
	 * @return List<Product> 产品列表
	 */
	public List<Product> getProductsByCategoryAndDisplayFlag(final ProductCategory productCategory,final Short displayFlag,final int size);
	
	
	 /**
     * 根据商品编码找出商品个数，但该商品的不能是参数id所指定的商品
     *
     * @param productCode 产品编码
     * @param productId 商品id
     * @return 个数
     */
    public Long getSizeByProductCodeByNotProductId(String productCode,Integer productId);
    /**
     * 获取指定数量的随机商品
     * @param count
     * @return
     */
    public List<Product> getRandomProductList(int count);
    
    /**
     * 获得平台商品总数
     * @return
     */
    public Long countProductTotal();
    /**
     * 获得平台上架商品总数
     * @return
     */
    public Long countShelvedProductTotal();
    /**
	 * 根据fieldName改变产品统计对应field的值。count为改变数量，可以为正，也可以为负。
	 */
	public void updateStatField(final Integer productStatId,final String fieldName,final Integer count);

	public List<Product> getListByDelete();
}